/*	--- Servlet开发 --- 

在上一节中，我们看到，一个完整的Web应用程序的开发流程如下：

	1. 编写【Servlet】；
	2. 打包为【war文件】；			<-- Core
	3. 复制到【Tomcat】的【webapps目录】下；
	4. 启动【Tomcat】。


这个过程是不是很繁琐？
如果我们想在【IDE】中【断点调试】，还需要打开【Tomcat的远程调试端口】并且【连接上去】。




许多【初学者】经常卡在【如何在IDE】中【启动Tomcat】并【加载webapp】，更不要说【断点调试】了。

-------------------------

我们需要一种简单可靠，能直接【在IDE中启动】并【调试webapp的方法】。

因为【Tomcat】实际上也是一个【Java程序】，我们看看【Tomcat的启动流程】：

	1. 【启动JVM】并【执行Tomcat的main()方法】；
	2. 【加载war】并【初始化Servlet】；
	3. 正常【服务】。


【启动Tomcat】无非就是【设置好classpath】并【执行Tomcat某个jar包的main()方法】，我们完全可以把【Tomcat的jar包】全部引入进来，然后自己编写【一个main()方法】，先【启动Tomcat】，然后让【Tomcat】加载【我们的webapp】就行。

我们新建一个【web-servlet-embedded工程】，【编写pom.xml】如下：

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itranswarp.learnjava</groupId>
    <artifactId>web-servlet-embedded</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <java.version>11</java.version>
        <tomcat.version>9.0.26</tomcat.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>${tomcat.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>${tomcat.version}</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>
</project>


===================================================


其中，【<packaging>的类型】仍然为【war】，引入依赖【tomcat-embed-core】和【tomcat-embed-jasper】，引入的【Tomcat版本<tomcat.version>为9.0.26】。

不必引入【Servlet API】，因为【引入Tomcat依赖】后【自动引入了Servlet API】。

因此，我们可以【正常编写Servlet】如下： */
@WebServlet(urlPatterns = "/")
public class HelloServlet extends HttpServlet {
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		resp.setContentType("text/html");
		String name = req.getParameter("name");

		if (name == null) {
			name = "world";
		}

		PrintWriter pw = resp.getWriter();
		pw.write("<h1>Hello, " + name + "!</h1>");
		pw.flush();
	}
}


/*
然后，我们编写【一个main()方法】，启动【Tomcat服务器】： */
public class Main {
	public static void main(String[] args) throws Exception {

		// 启动Tomcat:
		Tomcat tomcat = new Tomcat();
		tomcat.setPort(Integer.getInteger("port", 8080));
		tomcat.getConnector();

		// 创建webapp
		Context ctx = tomcat.addWebapp("", new File("src/main/webapp").getAbsolutePath());

		WebResourceRoot resources = new StandardRoot(ctx);
		resources.addPreResources(new DirResourceSet(resources, "/WEB-INF/classes", new File("target/classes").getAbsolutePath(), "/"));
		
		ctx.setResources(resources);

		tomcat.start();
		tomcat.getServer().await();

	}
}


/*
这样，我们直接运行【main()方法】，即可启动【嵌入式Tomcat服务器】

然后，通过【预设的tomcat.addWebapp("", new File("src/main/webapp")】，【Tomcat】会自动加载【当前工程】作为【根webapp】，可【直接】在【浏览器访问http://localhost:8080/ 】：


通过【main()方法】启动【Tomcat服务器】并加载【我们自己的webapp】有【如下好处】：

	1. 【启动简单】，无需下载Tomcat或安装任何IDE插件；
	2. 【调试方便】，可在IDE中使用断点调试；
	3. 使用【Maven】创建【war包】后，也可以【正常部署】到【独立的Tomcat服务器】中。

对【SpringBoot】有所了解的童鞋可能知道，SpringBoot也支持在【main()方法】中 一行代码 直接启动【Tomcat】，并且还能方便地更换成【Jetty等其他服务器】。

【Jetty的启动方式】和我们介绍的是基本一样的，后续涉及到【SpringBoot的部分】我们还会【详细讲解】。


========================================================================


#	练习

使用嵌入式Tomcat运行Servlet */




/*======================================================================

#	----- Servlet开发 の 小结 ----- 


1. 【开发Servlet】时，推荐【使用main()方法】启动【嵌入式Tomcat服务器】并【加载当前工程的webapp】，便于【开发调试】，且【不影响打包部署】，能极大地提升开发效率。




*/

















































